package com.iflytek.sbd.demo.threadlocal;

import lombok.SneakyThrows;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: sbd
 * @description:
 * @author: 陈英俊
 * @create: 2022-02-23 10:32
 */
public class DateUtil {

//    public static final ThreadLocal<String> t1 = new ThreadLocal();
//
//
//    public static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//
//    public static final ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
//        @Override
//        protected DateFormat initialValue() {
//            return new SimpleDateFormat("yyyy-MM-dd");
//        }
//    };
    // 简化lambda
     public static final ThreadLocal<DateFormat> threadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));


    /**
     * 此处知识点:
     * 一:　 public static final ThreadLocal　threadLocal　引用这样写的化，没有写泛型，下面的get,get出来的是Object,还是需要强转
     * 二: DateFormat 是线程不安全的,多线程环境直接new DateFormat是会出现线程安全问题的,所有用ThreadLocal包装一下
     * 调用的时候,直接DateUtil.threadLocal.get().format(new Date()) 返回之间字符产
     * 三: 此时为啥没有调用remove()?
     */


    public static void main(String[] args) {
        for (int i = 0; i < 80; i++) {
            int finalI = i;
            new Thread(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {

                    /**
                     *多线程场景解析直接出现问题
                     * df是静态变量,多线程环境是共享变量,
                     * 解决:用1次创建一次,但是太频繁了
                     * 加synchronized
                     * threadLocal
                     */
                    System.out.println(threadLocal.get().parse("2020-12-12"));
                }
            }, i + "").start();

        }

    }
}
